home *** CD-ROM | disk | FTP | other *** search
/ The CICA Windows Explosion! / The CICA Windows Explosion! - Disc 2.iso / programr / progwin.zip / GRAFMENU.ZIP / GRAFMENU.C < prev    next >
C/C++ Source or Header  |  1991-10-30  |  6KB  |  235 lines

  1. /*-----------------------------------------------
  2.     GRAFMENU.C -- Demostrates Bitmap Menu Items
  3.             (c) Charles Petzold, 1990
  4.  -------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <string.h>
  8. #include "grafmenu.h"
  9.  
  10. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG) ;
  11. HBITMAP StretchBitmap (HBITMAP);
  12. HBITMAP GetBitmapFont (int);
  13.  
  14. char szAppName [] = "GrafMenu";
  15.  
  16. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  17.             LPSTR lpszCmdLine, int nCmdShow)
  18.     {
  19.     HBITMAP    hBitmapHelp, hBitmapFile, hBitmapEdit,
  20.             hBitmapFont, hBitmapPopFont [3];
  21.     HMENU        hMenu, hMenuPopup;
  22.     HWND        hwnd;
  23.     int         i;
  24.     MSG         msg;
  25.     WNDCLASS    wndclass;
  26.  
  27.     if (!hPrevInstance)
  28.          {
  29.          wndclass.style        = CS_HREDRAW | CS_VREDRAW;
  30.          wndclass.lpfnWndProc   = WndProc;
  31.          wndclass.cbClsExtra    = 0;
  32.          wndclass.cbWndExtra    = 0;
  33.          wndclass.hInstance        = hInstance;
  34.          wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION);
  35.          wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW);
  36.          wndclass.hbrBackground = GetStockObject (WHITE_BRUSH);
  37.          wndclass.lpszMenuName  = NULL;
  38.          wndclass.lpszClassName = szAppName;
  39.  
  40.          RegisterClass (&wndclass);
  41.         }
  42.  
  43.     hMenu = CreateMenu ();
  44.  
  45.     hMenuPopup = LoadMenu (hInstance, "MenuFile");
  46.     hBitmapFile = StretchBitmap (LoadBitmap (hInstance, "BitmapFile"));
  47.     AppendMenu (hMenu, MF_BITMAP | MF_POPUP, hMenuPopup,
  48.               (LPSTR) (LONG) hBitmapFile);
  49.     hMenuPopup = LoadMenu (hInstance, "MenuEdit");
  50.     hBitmapEdit = StretchBitmap (LoadBitmap (hInstance, "BitmapEdit"));
  51.     AppendMenu (hMenu, MF_BITMAP | MF_POPUP, hMenuPopup,
  52.                 (LPSTR) (LONG) hBitmapEdit);
  53.  
  54.     hMenuPopup = CreateMenu ();
  55.  
  56.     for (i = 0 ; i < 3 ; i++)
  57.          {
  58.          hBitmapPopFont [i] = GetBitmapFont (i);
  59.          AppendMenu (hMenuPopup, MF_BITMAP, IDM_COUR + i,
  60.                      (LPSTR) (LONG) hBitmapPopFont [i]);
  61.          }
  62.  
  63.     hBitmapFont = StretchBitmap (LoadBitmap (hInstance, "BitmapFont"));
  64.     AppendMenu (hMenu, MF_BITMAP | MF_POPUP, hMenuPopup,
  65.             (LPSTR) (LONG) hBitmapFont);
  66.  
  67.     hwnd = CreateWindow (szAppName,  "Bitmap Menu Demonstration",
  68.                           WS_OVERLAPPEDWINDOW,
  69.                           CW_USEDEFAULT, CW_USEDEFAULT,
  70.                           CW_USEDEFAULT, CW_USEDEFAULT,
  71.                           NULL, hMenu, hInstance, NULL);
  72.  
  73.     hMenu = GetSystemMenu (hwnd, FALSE);
  74.     hBitmapHelp = StretchBitmap (LoadBitmap (hInstance, "BitmapHelp"));
  75.     AppendMenu (hMenu, MF_SEPARATOR, NULL,              NULL);
  76.     AppendMenu (hMenu, MF_BITMAP,      IDM_HELP, (LPSTR) (LONG) hBitmapHelp);
  77.  
  78.     ShowWindow (hwnd, nCmdShow);
  79.     UpdateWindow (hwnd);
  80.  
  81.     while (GetMessage (&msg, NULL, 0, 0))
  82.         {
  83.         TranslateMessage (&msg);
  84.         DispatchMessage (&msg);
  85.         }
  86.  
  87.     DeleteObject (hBitmapHelp);
  88.     DeleteObject (hBitmapEdit);
  89.     DeleteObject (hBitmapFile);
  90.     DeleteObject (hBitmapFont);
  91.  
  92.     for (i = 0; i < 3; i++)
  93.         DeleteObject (hBitmapPopFont [i]);
  94.  
  95.     return msg.wParam;
  96.     }
  97.  
  98.  HBITMAP StretchBitmap (HBITMAP hBitmap1)
  99.     {
  100.     BITMAP    bm1, bm2;
  101.     HBITMAP    hBitmap2;
  102.     HDC        hdc, hdcMem1, hdcMem2;
  103.     TEXTMETRIC  tm;
  104.  
  105.     hdc = CreateIC ("DISPLAY", NULL, NULL, NULL);
  106.     GetTextMetrics (hdc, &tm);
  107.     hdcMem1 = CreateCompatibleDC (hdc);
  108.     hdcMem2 = CreateCompatibleDC (hdc);
  109.     DeleteDC (hdc);
  110.  
  111.     GetObject (hBitmap1, sizeof (BITMAP), (LPSTR) &bm1);
  112.  
  113.     bm2 = bm1;
  114.     bm2.bmWidth        = (tm.tmAveCharWidth * bm2.bmWidth) / 4;
  115.     bm2.bmHeight    = (tm.tmHeight       * bm2.bmHeight) / 8;
  116.     bm2.bmWidthBytes  = ((bm2.bmWidth + 15) / 16) * 2;
  117.  
  118.     hBitmap2 = CreateBitmapIndirect (&bm2);
  119.  
  120.     SelectObject (hdcMem1, hBitmap1);
  121.     SelectObject (hdcMem2, hBitmap2);
  122.  
  123.     StretchBlt (hdcMem2, 0, 0, bm2.bmWidth, bm2.bmHeight,
  124.                 hdcMem1, 0, 0, bm1.bmWidth, bm1.bmHeight, SRCCOPY);
  125.  
  126.     DeleteDC (hdcMem1);
  127.     DeleteDC (hdcMem2);
  128.     DeleteObject (hBitmap1);
  129.  
  130.     return hBitmap2;
  131.     }
  132.  
  133.  HBITMAP GetBitmapFont (int i)
  134.     {
  135.     static struct
  136.         {
  137.         BYTE lfPitchAndFamily;
  138.         BYTE lfFaceName [LF_FACESIZE];
  139.         char *szMenuText;
  140.         }
  141.         lfSet [3] =
  142.         {
  143.         FIXED_PITCH       | FF_MODERN, "Courier",   "Courier",
  144.         VARIABLE_PITCH | FF_SWISS,  "Helvetica", "Helvetica",
  145.         VARIABLE_PITCH | FF_ROMAN,  "Tms Rmn",   "Times Roman"
  146.         };
  147.     DWORD       dwSize;
  148.     HBITMAP    hBitmap;
  149.     HDC        hdc, hdcMem;
  150.     HFONT       hFont;
  151.     LOGFONT    lf;
  152.  
  153.     hFont = GetStockObject (SYSTEM_FONT);
  154.     GetObject (hFont, sizeof (LOGFONT), (LPSTR) &lf);
  155.  
  156.     lf.lfHeight *= 2;
  157.     lf.lfWidth  *= 2;
  158.     lf.lfPitchAndFamily = lfSet[i].lfPitchAndFamily;
  159.     strcpy (lf.lfFaceName, lfSet[i].lfFaceName);
  160.  
  161.     hdc = CreateIC ("DISPLAY", NULL, NULL, NULL);
  162.     hdcMem = CreateCompatibleDC (hdc);
  163.     SelectObject (hdcMem, CreateFontIndirect (&lf));
  164.     dwSize = GetTextExtent (hdcMem, lfSet[i].szMenuText,
  165.                     strlen (lfSet[i].szMenuText));
  166.  
  167.     hBitmap = CreateBitmap (LOWORD (dwSize)-1, HIWORD (dwSize), 1, 1, NULL);
  168.     SelectObject (hdcMem, hBitmap);
  169.  
  170.  
  171.     TextOut (hdcMem, 0, 0, lfSet[i].szMenuText,
  172.                      strlen (lfSet[i].szMenuText));
  173.  
  174.     DeleteObject (SelectObject (hdcMem, hFont));
  175.     DeleteDC (hdcMem);
  176.     DeleteDC (hdc);
  177.  
  178.     return hBitmap;
  179.     }
  180.  
  181.  long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  182.     {
  183.     HMENU        hMenu;
  184.     static short nCurrentFont = IDM_COUR;
  185.  
  186.     switch (message)
  187.          {
  188.          case WM_CREATE:
  189.             CheckMenuItem (GetMenu (hwnd), nCurrentFont, MF_CHECKED);
  190.             return 0;
  191.  
  192.          case WM_SYSCOMMAND:
  193.             switch (wParam)
  194.                {
  195.                case IDM_HELP:
  196.                   MessageBox (hwnd, "Help not yet implemented.",
  197.                         szAppName, MB_OK | MB_ICONEXCLAMATION);
  198.                   return 0;
  199.                }
  200.             break;
  201.  
  202.          case WM_COMMAND:
  203.             switch (wParam)
  204.                {
  205.                case IDM_NEW:
  206.                case IDM_OPEN:
  207.                case IDM_SAVE:
  208.                case IDM_SAVEAS:
  209.                case IDM_UNDO:
  210.                case IDM_CUT:
  211.                case IDM_COPY:
  212.                case IDM_PASTE:
  213.                case IDM_CLEAR:
  214.                   MessageBeep (0);
  215.                   return 0;
  216.  
  217.                case IDM_COUR:
  218.                case IDM_HELV:
  219.                case IDM_TMSRMN:
  220.                   hMenu = GetMenu (hwnd);
  221.                   CheckMenuItem (hMenu, nCurrentFont, MF_UNCHECKED);
  222.                   nCurrentFont = wParam;
  223.                   CheckMenuItem (hMenu, nCurrentFont, MF_CHECKED);
  224.                   return 0;
  225.                }
  226.             break;
  227.  
  228.          case WM_DESTROY:
  229.             PostQuitMessage (0);
  230.             return 0;
  231.          }
  232.     return DefWindowProc (hwnd, message, wParam, lParam);
  233.     }
  234.  
  235.